﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using org.pdfbox.pdmodel;
using org.pdfbox.util;

namespace TryTM
{
    public partial class frmMain : Form
    {
        char[] charArr = new char[] { ' ', '.', ',', '!', '?', ')', '(', '"', '\'', '/', '-', '–', '^', ':', '<', '>', '"', '\t', '«', '»', '*', '[', ']', '•', '|', '—', 'o' };
        public void parsePDF(string pdf_in, string txt_out) //из pdf-файла получаем txt-файл
        {
            StreamWriter sw = new StreamWriter(txt_out, false);
            try
            {
                PDDocument doc = PDDocument.load(pdf_in);
                PDFTextStripper stripper = new PDFTextStripper();
                sw.Write(stripper.getText(doc));
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            finally
            {
                sw.Close();
                sw.Dispose();
            }
        }

        public int DetectLanguage(int code) //здесь я смотрела таблицы Юникода
        {
            if ((code >= 1040) && (code <= 1103))
            {
                return UsedLanguage.Russian;
            }
            if ((code >= 13312) && (code <= 40891))
            {
                return UsedLanguage.Chinese;
            }
            return UsedLanguage.NotDetected; //значит, это был символ другого языка, либо знак препинания какой-нибудь
        }

        public void Create_View_for_PDF(string WhatFile)
        {//создание локального представления для pdf, начальный этап
            string TempFileName = Application.StartupPath + @"\33.korovi.q.txt";
            parsePDF(WhatFile, TempFileName); //отлично, у нас есть txt, его надо пропарсить
            Parametrized_Add(WhatFile, TempFileName);
        }

        private void Parametrized_Add(string WhatFile, string TempFileName)
        {
            //нужно определить язык:
            FileStream HFile = new FileStream(TempFileName, FileMode.Open);
            StreamReader SReader = new StreamReader(HFile);
            char[] BufferNya = new char[1];
            int NotEnd = 1;
            int WhatLanguage = UsedLanguage.NotDetected;
            int WhatUnicode = -1;
            string[] strArr;
            //char[] charArr = new char[] { ' ' };
            try
            {//так уж получилось, что первые 2 строки у нас всегда левые, поскольку юзается конвертер
                while ((NotEnd > 0) && (WhatLanguage == UsedLanguage.NotDetected))
                {
                    NotEnd = SReader.ReadBlock(BufferNya, 0, 1);
                    WhatUnicode = (int)BufferNya[0]; //здесь мы, наконец, получили юникод!!!
                    WhatLanguage = DetectLanguage(WhatUnicode);
                }

                //string line2 = BufferNya[0].ToString() + SReader.ReadToEnd();

                switch (WhatLanguage)
                {
                    case UsedLanguage.Chinese:
                        Add_To_RichBox("Определён язык: КИТАЙСКИЙ!!!");
                        Add_To_Table_With_Local_View_ChineseFile(SReader, WhatUnicode, WhatFile, WhatLanguage);
                        break;
                    case UsedLanguage.Russian:
                        Add_To_RichBox("Определён язык: РУССКИЙ!!!");
                        //FIXME тут заглушка для кода Старостюши
                        string line = BufferNya[0].ToString() + SReader.ReadToEnd();
                        strArr = line.Split(charArr);
                        Add_To_Table_With_Local_View_RussiaFile(strArr, WhatFile, WhatLanguage);
                        break;
                    case UsedLanguage.NotDetected:
                        Add_To_RichBox("Язык не определён."); // а значит, делать ничего не будем. нечего левый файл подсовывать.
                        break;
                }
                //отлично, со словами разобрались. Самое время взяться  за поиск автора.
                if (UsedLanguage.NotDetected != WhatLanguage)
                {
                    Add_To_RichBox("Определение авторов...");
                    SearchAuthor(SReader, WhatFile);
                    Add_To_RichBox("Определение УДК...");
                    SearchUDK(SReader, WhatFile);
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            finally
            {
                SReader.Close();
                HFile.Close();
            }
        }

        class UsedLanguage //определяет используемые в системе языкиp
        {
            public const int NotDetected = -1;
            public const int Russian = 0;
            public const int Chinese = 1;
        }

        public void Create_View_for_Doc(string WhatFile)
        {
            //создание локального представления для doc, начальный этап
            Parametrized_Add(WhatFile, WhatFile);
            //Calculate_IDF();
        }

        public bool StopWords(string word)
        {
            int i = 0;
           // string[] strArr;
            List<string > strArr=new List<string>();
            using (StreamReader sr = new StreamReader(Application.StartupPath + @"\Stop.txt", Encoding.Unicode))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    strArr.Add(line);

                }

               // string line = sr.ReadToEnd();
                //strArr = line.Split(charArr);
                if (word != null) return strArr.Any(stopword => word.Trim().ToLower() == stopword.Trim().ToLower());
                else return false;
            }
        }
    }

}
